//
//  SeqQueue.hpp
//  408数据结构
//
//  Created by Cai Yuanhao on 2022/3/26.
//
//这种循环队列的实现方式解决了假溢出问题，但是空余了一个空间。可以在定义结构体时增加一个Q.size记录队列大小。
//或者设置tag标签，表示最近一次操作，0和1分别表示进行了插入和删除。

#ifndef SeqQueue_hpp
#define SeqQueue_hpp

#include <stdio.h>

#endif /* SeqQueue_hpp */
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 50
typedef int ElemType;

typedef struct
{
    ElemType data[MAXSIZE];
    int front, rear;
} SqQueue;

void InitQueue(SqQueue &Q){
    Q.rear=Q.front=0;
}

bool isEmpty(SqQueue Q){
    if (Q.rear==Q.front) {
        return true;
    }
    return false;
}

bool isFull(SqQueue Q){
    if ((Q.rear+1)%MAXSIZE==Q.front) {
        return true;
    }
    return false;
}

bool EnQueue(SqQueue &Q,ElemType e){
    if (isFull(Q)) {
        return false;
    }
    Q.data[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXSIZE;
//    队尾指针加1取模
    return true;
}

bool DeQueue(SqQueue &Q,ElemType &e){
    if (isEmpty(Q)) {
        return false;
    }
    e=Q.data[Q.front];
    Q.front=(Q.front+1)%MAXSIZE;
    return true;
}

bool GetElem(SqQueue &Q,ElemType &e){
    if (isEmpty(Q)) {
        return false;
    }
    e=Q.data[Q.front];
    return true;
}

int GetLen(SqQueue Q){
    return (Q.rear+MAXSIZE-Q.front)%MAXSIZE;
}



